如何扩展 SQS FIFO 队列多个侦听器
How to scale a SQS FIFO queue multiple listeners
我有三个 SQS FIFO 队列,每个队列在 EC2 实例中都有一个数据投影侦听器守护程序,如 docker pods(SQL 服务器、PostgreSQL、Elastic搜索等)
所有队列的设置如下(死信队列稍后设置)。
Queue Type: FIFO
Messages Delayed: 0
Content-Based Deduplication: Enabled
Default Visibility Timeout: 30 seconds
Message Retention Period: 14 days
Maximum Message Size: 256 KB
这是我使用 DynamoDB Stream => Lambda SQS Router => SQS FIFO 队列设计的事件溯源架构的全部内容(由于 SNS 不支持 FIFO 队列作为订阅者)
Content-Based Deduplication
已启用以避免队列中的重复消息,因为 Lambda 路由器中的任何队列都可能出错。
现在,我还为每条消息设置了 MessageGroupId
到 AggregateId 以对它们进行分组,但我不太了解消费者端如何使用它;
我现在每个 SQS 队列只有一个消费者,但如果我想扩展消费者怎么办。
确保多个消费者不会处理来自同一 MessageGroupId 的消息是应用程序关注的问题; - 这是不可接受的,因为使用 FIFO 队列是由于系统中事件的顺序保留!
如果从 FIFO Amazon SQS 队列接收到一条消息但它仍然不可见 ("in-flight"),则 SQS 将不会提供具有相同 MessageGroupId
的另一条消息。
因此,同一队列中的多个消费者将收到具有不同 MessageGroupId
的消息,并且将保留给定 MessageGroupId
内的消息顺序。
这里重要的是在您希望保持顺序的地方使用不同的 MessageGroupId
,但不要对每条消息都使用相同的 MessageGroupId
。
我有三个 SQS FIFO 队列,每个队列在 EC2 实例中都有一个数据投影侦听器守护程序,如 docker pods(SQL 服务器、PostgreSQL、Elastic搜索等)
所有队列的设置如下(死信队列稍后设置)。
Queue Type: FIFO
Messages Delayed: 0
Content-Based Deduplication: Enabled
Default Visibility Timeout: 30 seconds
Message Retention Period: 14 days
Maximum Message Size: 256 KB
这是我使用 DynamoDB Stream => Lambda SQS Router => SQS FIFO 队列设计的事件溯源架构的全部内容(由于 SNS 不支持 FIFO 队列作为订阅者)
Content-Based Deduplication
已启用以避免队列中的重复消息,因为 Lambda 路由器中的任何队列都可能出错。
现在,我还为每条消息设置了 MessageGroupId
到 AggregateId 以对它们进行分组,但我不太了解消费者端如何使用它;
我现在每个 SQS 队列只有一个消费者,但如果我想扩展消费者怎么办。 确保多个消费者不会处理来自同一 MessageGroupId 的消息是应用程序关注的问题; - 这是不可接受的,因为使用 FIFO 队列是由于系统中事件的顺序保留!
如果从 FIFO Amazon SQS 队列接收到一条消息但它仍然不可见 ("in-flight"),则 SQS 将不会提供具有相同 MessageGroupId
的另一条消息。
因此,同一队列中的多个消费者将收到具有不同 MessageGroupId
的消息,并且将保留给定 MessageGroupId
内的消息顺序。
这里重要的是在您希望保持顺序的地方使用不同的 MessageGroupId
,但不要对每条消息都使用相同的 MessageGroupId
。